package chatbot

import "errors"

// Talk 定义了聊天的接口类型。
type Talk interface {
	Hello(userName string) string
	Talk(heard string) (saying string, end bool, err error)
}

// ChatBot 定义了聊天机器人的接口类型。
type ChatBot interface {
	Name() string
	Begin() (string, error)
	Talk
	ReportError(err error) string
	End() error
}

var (
	// ErrInvalidChatBotName 代表无效的聊天机器人名称的错误。
	ErrInvalidChatBotName = errors.New("Invalid ChatBot name")
	// ErrInvalidChatBot 代表无效的聊天机器人的错误。
	ErrInvalidChatBot = errors.New("Invalid ChatBot")
	// ErrExistingChatBot 代表对同名的聊天机器人进行重复注册的错误。
	ErrExistingChatBot = errors.New("Existing ChatBot")
)

// ChatBotMap 代表了名称-聊天机器人的映射。
var ChatBotMap = map[string]ChatBot{}

// Register 用于注册聊天机器人。
// 若结果值为nil则表示注册成功。
func Register(ChatBot ChatBot) error {
	if ChatBot == nil {
		return ErrInvalidChatBot
	}
	name := ChatBot.Name()
	if name == "" {
		return ErrInvalidChatBotName
	}
	if _, ok := ChatBotMap[name]; ok {
		return ErrExistingChatBot
	}
	ChatBotMap[name] = ChatBot
	return nil
}

// Get 用于获取指定名称的聊天机器人。
func Get(name string) ChatBot {
	return ChatBotMap[name]
}
